package com.hdd.fmh.common.interceptor;

import com.hdd.fmh.common.annotation.NoToken;
import com.hdd.fmh.common.config.Global;
import com.hdd.fmh.common.redis.RedisMapper;
import com.hdd.fmh.common.response.ResultIoVo;
import com.hdd.fmh.common.response.ResultUtils;
import com.hdd.fmh.common.response.ResultVo;
import com.hdd.fmh.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;

/**
 * @author H 登录token验证拦截器
 */
public class LoginInterceptor   implements HandlerInterceptor{
	@Autowired
	RedisMapper redisMapper;
	/**
	 * 方法请求前拦截url是否需要权限认证 token 不再 或者获取用户失败 表示没有权限
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		//1  	如果不是映射到方法直接通过
		if (!(handler instanceof HandlerMethod)) {
			return true;
		}
		HandlerMethod handlerMethod = (HandlerMethod) handler;
		Method method = handlerMethod.getMethod();

		//2 有ZkNoToken 注解的 needToken = ture 不需要 验证
		if (method.isAnnotationPresent(NoToken.class) && method.getAnnotation(NoToken.class).isToken()) {
			return true;
		}
		//3 	从请求头中 获取token 参数 字段名字为 Authorization
		String token = request.getHeader("token");
		if (StringUtils.isBlank(token)) {
			ResultIoVo.responseOutWithJson(response,  ResultUtils.fail("common.not.token"));
			return false;
		}
		
		//5 	redis中取值
		String userdb = redisMapper.get(token);
		if (StringUtils.isBlank(userdb)) {
			ResultIoVo.responseOutWithJson(response, ResultUtils.fail("common.not.token"));
			return false;
		}
		//6  重置redis中的值
		redisMapper.setEx(token,userdb, Global.getConfigInteger("user.login.token.timeout"), TimeUnit.MINUTES);
		return true;
	}
}
